//==========================================  
//
//  @ Project : Algoritmos Geneticos
//  @ File Name : Regra.java
//  @ Date : 25/08/2010
//  @ Author : Leanderson Andr�
//
//==========================================  

package sistemaClassificador.algoritmoGenetico;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import weka.core.Instance;

public class Regra {
	private List<Condicao> listaCondicao;
	private double fitness;
	private double taxaCobertura;
	private String classe;
	private int tamanho;
	private double ebid;
	private double bidt;

	

	public Regra(int tamanho) {
		this.tamanho = tamanho;
		listaCondicao = new ArrayList<Condicao>();
	}

	public int size() {
		return tamanho;
	}

	public void addCondicao(Condicao c) throws Exception {
		if (listaCondicao.size() == tamanho) {
			throw new Exception("Lista de Condicao cheia. Tamanho " + tamanho);
		}
		listaCondicao.add(c);
	}

	public int getTamanho() {
		return tamanho;
	}
	
	public Condicao getCondicao(int index) throws Exception {
		return listaCondicao.get(index);
	}

	public void setCondicao(Condicao c, int index) {
		listaCondicao.set(index, c);
	}

	public Condicao removeCondicao(int index) {
		return listaCondicao.remove(index);
	}

	public double getFitness() {
		return fitness;
	}

	public void setFitness(double fit) {
		fitness = fit;
	}

	public double getTaxaCobertura() {
		return taxaCobertura;
	}

	public void setTaxaCobertura(double tax) {
		taxaCobertura = tax;
	}

	public String getClasse() {
		return classe;
	}

	public void setClasse(String str) {
		classe = str;
	}

	public void gerarCondicaoInicial(Instance i, Random geradorRandom,
			int proporcaoAtivos) {
		boolean existeAtivo = false;
		while (!existeAtivo) {
			for (int a = 0; a < (i.numValues() - 1); a++) {
				try {
					addCondicao(Condicao.getRandomCondicao(i.stringValue(a)
							.toString(), geradorRandom, proporcaoAtivos));
				} catch (Exception e) {
					e.printStackTrace();
				}
			}

			// Função para checar se existe algum atributo ativo

			for (int a = 0; a < size(); a++) {
				try {
					if (getCondicao(a).isAtivo()) {
						existeAtivo = true;
						break;
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			if (!existeAtivo)
				removeAll();
		}
	}

	public void removeAll() {
		listaCondicao.clear();
	}

	public String toString() {
		StringBuilder sb = new StringBuilder();
		sb.append("REG(Fitness:" + getFitness() + " Qtd Condicoes: " + size()
				+ " Classe: " + getClasse() + " Condicoes: ");
		for (int a = 0; a < size(); a++) {
			try {
				sb.append(getCondicao(a));
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		sb.append(")");
		return sb.toString();
	}

	public double getEbid() {
		return ebid;
	}

	public void setEbid(double ebid) {
		this.ebid = ebid;
	}

	public double getBidt() {
		return bidt;
	}

	public void setBidt(double bidt) {
		this.bidt = bidt;
	}

	public double getSpec() {
		int inat = 0;
		double spec = 0;
		for (int a = 0; a < size(); a++) {
			try {
				if (!getCondicao(a).isAtivo())
					inat++;
			} catch (Exception e) {
				e.printStackTrace();
			}

		}

		double y = (double) size();
		spec = (y - inat) / y;
		// System.out.println("Inat = "+inat);
		return spec;
	}

}
